package br.edu.unibratec.lancenet;

import java.util.List;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.AsyncTask;
import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * Fragment da lista de posts.
 * 
 * @author Daniel, Esdras, Naftali
 */
public class ListPostsFragment extends ListFragment {

	List<PostLance> posts;
	ReadPostsAsyncTask task;
	ProgressBar progress;
	TextView txtMensagem;
		
	/**
	 * Cria uma nova inst�ncia da propria classe.
	 * 
	 * @param rss
	 * @return
	 */
	public static ListPostsFragment novaInstancia(String rss){
		Bundle args = new Bundle();
		args.putSerializable("rss", rss);
		
		ListPostsFragment f = new ListPostsFragment();
		f.setArguments(args);
		return f;
	}
	
	/**
	 * Cria a View do fragment da lista de posts e retorna a View criada.
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View layout = inflater.inflate(R.layout.fragment_lista_posts,
				container, false);

		progress = (ProgressBar) layout.findViewById(R.id.progressBar1);
		txtMensagem = (TextView) layout.findViewById(R.id.textView1);

		return layout;
	}
	
	/**
	 * Chamado quando a Activity da lista de posts for criada
	 * e o fragment instanciado. 
	 */
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		
		// Salva a inst�cia do fragment.
		setRetainInstance(true);
		
		// Verifica se a lista de posts est� preenchida.
		if (posts != null){
			// Remove a barra de progresso e atualiza a lista.
			txtMensagem.setVisibility(View.GONE);
			progress.setVisibility(View.GONE);
			refreshList();
			
		} else {
			
			if (task == null) {
				
				// Mostra uma mensagem ao usu�rio caso o download n�o tenha sido solicitado.
				escolherTime();
				
			} else if (task != null && task.getStatus() == Status.RUNNING){
				
				// Mostra a barra de progresso enquanto o download est� sendo executado.
				mostrarProgress();
			} 
		}
	}

	/**
	 * Fun��o que solicita o donwload dos posts.
	 * @param rss URL do RSS
	 */
	void iniciarDownload(String rss) {
		
		ConnectivityManager cm = (ConnectivityManager) getActivity()
				.getSystemService(Context.CONNECTIVITY_SERVICE);

		// Verifica se a conex�o existe e se est� conectado.
		if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected()) {

			task = new ReadPostsAsyncTask();
			task.execute(rss);

		} else {
			
			progress.setVisibility(View.GONE);
			txtMensagem.setVisibility(View.VISIBLE);
			txtMensagem.setText(getString(R.string.sem_conexao));
		}
	}

	
	
	/**
	 * Listener que executa o m�todo postFoiClicado no clique de um �tem da lista.
	 */
	@Override
	public void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		
		if (getActivity() instanceof ClicouNoPost){
			((ClicouNoPost)getActivity()).postFoiClicado(posts.get(position));
		}
	}
	
	/**
	 * Atualiza a lista de posts.
	 */
	private void refreshList() {
	
		PostLanceAdapter adapter = new PostLanceAdapter(getActivity(), posts, false);
		setListAdapter(adapter);
	}
	
	/**
	 * Exibe a barra de progresso com mensagem enquanto carrega os posts.
	 */
	private void mostrarProgress() {
		progress.setVisibility(View.VISIBLE);
		txtMensagem.setVisibility(View.VISIBLE);
		txtMensagem.setText("Carregando...");
	}
	
	/**
	 * Exibe uma mensagem ao usu�rio caso ele n�o tenha escolhido um time na aba Times.
	 */
	private void escolherTime() {
		progress.setVisibility(View.GONE);
		txtMensagem.setVisibility(View.VISIBLE);
		txtMensagem.setText("Escolha um time");
	}
	
	/**
	 * A AsyncTask exibe o progresso ao usuario enquanto uma tarefa est� sendo executada em background,
	 * a tarefa executada � o download dos posts.
	 * 
	 * Ap�s o download, a lista de posts � retornada e em seguida a lista � exibida na tela.
	 * 
	 * O primeiro parametro gen�rico 'String' ser� passado como par�metro no m�todo doInBackground.
	 * O segundo parametro 'Void', pode ser usado para enviar o progresso de alguma execu��o da Thread onProgressUpdate.
	 * O terceiro parametro � o tipo de retorno da a��o que ser� realizada em segundo plano.
	 * 
	 * @author Daniel, Esdras, Naftali
	 *
	 */
	class ReadPostsAsyncTask extends AsyncTask<String, Void, List<PostLance>> {

		/**
		 * Exibe o progresso ao usu�rio enquanto o donwload dos posts � executado.
		 */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			mostrarProgress();
		}

		/**
		 * Efetua o download dos posts em background
		 */
		@Override
		protected List<PostLance> doInBackground(String... params) {
			try {
				Thread.sleep(4000);
				return LeitorRSSActivity.retrievePosts(params[0]);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}

		/**
		 * Recebe o resultado do download e exibe na tela.
		 */
		@Override
		protected void onPostExecute(List<PostLance> result) {
			super.onPostExecute(result);
			if (result != null) {
				posts = result;
				refreshList();
				txtMensagem.setVisibility(View.GONE);
			} else {
				txtMensagem.setText("Deu erro!");
			}
			progress.setVisibility(View.GONE);
		}
	}
	
	/**
	 * Limpa a lista de posts e atualiza a lista.
	 */
	void removeList() {
		if (posts != null) {
			posts.clear();
			refreshList();
		}
	}
}